package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.po.R;
import com.itheima.po.User;
import com.itheima.service.UserService;
import com.itheima.util.SMSUtils;
import com.itheima.util.ValidateCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author Andy
 * @Description //TODO UserMobileController
 * @Date 2022/3/18 3:16 下午
 * @Version 1.0
 **/
//Request URL: http://localhost:8080/user/sendMsg
//        Request Method: POST
@RestController
@RequestMapping("/user")
public class UserMobileController {

//    业务应用（瑞吉点餐）--》短信第三方服务商--》移动、联通、电信--》用户
/*
步骤：
1. 粘贴复制资料中的SMSUtils与ValidateCodeUtils工具类到项目中的utils包中
2. 在SMSUtils工具类中的注释部分有一个hutool的工具类的依赖坐标，复制到pom.xml中 然后更新maven
3. 创建UserMobileController类，实现sendMsg的接口
3.1 生成一个验证码通过ValidateCodeUtils生成一个验证码
3.2 调用SMSUtils把验证码发送给第三方短信服务商
3.3 验证码存储起来，可以存储在当前用户的session，可以存储在进程外缓存中，今天呢，存储在session中
4. 在过滤器中添加/user/sendMsg与/user/login的接口放行，例如
    。。。
    public static final String USER_SEND_MSG = "/user/sendMsg";
    public static final String USER_LOGIN = "/user/login";

    。。。
    else if (requestUri.equals(USER_SEND_MSG)){
            filterChain.doFilter(servletRequest, servletResponse);
        }else if (requestUri.equals(USER_LOGIN)){
            filterChain.doFilter(servletRequest, servletResponse);
        }



 */

    /**
     * 改用redis来存储验证码？
     * key value
     * key是怎样的值？key在redis中要保证全局唯一。
     * 用手机号作为key
     * redis key value(string hash list set zset)
     * 要用什么数据结构来存储验证码?
     * string
     *
     * @param user
     * @param httpSession
     * @return
     */
    @PostMapping("/sendMsg")
    public R<String> sendMsg(@RequestBody User user, HttpSession httpSession){
//        1 生成一个验证码通过ValidateCodeUtils生成一个验证码
        Integer code = ValidateCodeUtils.generateValidateCode(4);
//        2 调用SMSUtils把验证码发送给第三方短信服务商
        String mobile = "";
        //验证码
        //签名ID。（联系客服申请。测试请用：2e65b1bb3d054466b82f0c9d125465e2）
        String smsSignId="2e65b1bb3d054466b82f0c9d125465e2";
        //模板ID。（联系客服申请。测试ID请用：908e94ccf08b4476ba6c876d13f084ad，短信内容为 { 验证码：**code**，**minute**分钟内有效，请勿泄漏于他人！}）
        String templateId="908e94ccf08b4476ba6c876d13f084ad";
        //应用code  https://market.console.aliyun.com/imageconsole/index.htm?#/bizlist?_k=r5f9m0 查找
        String appCode="";
//        SMSUtils.sendMessage(smsSignId, templateId, user.getPhone(), code.toString(),appCode);
        System.out.println("为了测试，code是 "+ code);
//        3 验证码存储起来，可以存储在当前用户的session，可以存储在进程外缓存中，今天呢，存储在session中
//        httpSession.setAttribute(user.getPhone(), code);
        redisTemplate.opsForValue().set(user.getPhone(), code, 5L, TimeUnit.MINUTES);
        return R.success("发送成功");
    }

//    登录步骤：
//    1. 接收post请求的参数手机号与验证码
//    2. 判断该手机号的验证码是否正确
//    3. 如果不是一个新用户的话，创建用户，然后把用户的ID放入到session中
//    4. 在过滤器中对/user/login接口放行
//    5. 在过滤器中添加对手机端用户登录的登录状态验证，类似后台管理的登录状态验证

    @Autowired
    private UserService userService;

    @Autowired
    private RedisTemplate redisTemplate;

    @PostMapping("/login")
    public R<User> login(@RequestBody Map<String, String> map, HttpSession httpSession){
//        获取前端传递的手机号与验证码
        String phone = map.getOrDefault("phone", "");
        String code = map.getOrDefault("code", "");
//        从session中获取发送验证码时存储的验证码
//        Object codeInSession = httpSession.getAttribute(phone);
        Object codeInRedis = redisTemplate.opsForValue().get(phone);
//        验证码比较
        if (!code.equals(codeInRedis.toString())){
            R.error("验证码不正确");
        }
        redisTemplate.delete(phone);
//       验证码比较是一样的
//        如果不是一个新用户的话，创建用户
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getPhone, phone);
        User userInDb = userService.getOne(userLambdaQueryWrapper);
        if (null == userInDb){ //新用户
            userInDb = new User();
            userInDb.setPhone(phone);
            userInDb.setStatus(1);
            userService.save(userInDb);
        }
//        然后把用户的ID放入到session中
        httpSession.setAttribute("userId", userInDb.getId());
        return R.success(userInDb);
    }
}




//